-- 
-- Control super estricto en la base de datos para stock mayor a cero 
--

CREATE OR REPLACE FUNCTION stock.actualizar_stk(
	pidart integer,
	pcodstkdep character varying,
	pcant numeric,
	pcantsec numeric)
    RETURNS void
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE 
AS $BODY$
-- Actualiza la tabla de stock físico para un artículo dado en un depósito dado
DECLARE
  vMensaje varchar;
BEGIN
	UPDATE public.Stk SET Stock = Stock + pCant, StockSec = StockSec + pCantSec 
	       WHERE (IdArt = pIdArt) AND (CodStkDep = pCodStkDep);
	IF (NOT FOUND) THEN
		INSERT INTO public.Stk (IdArt, CodStkDep, StockMinimo, Reposicion, Stock, StockSec,
							    idambdb, fechainsert, fechaupdate)
				VALUES (pIdArt, pCodStkDep, 0, 0, pCant, pCantSec, null, null, null);
	END IF;
	IF  EXISTS (SELECT * FROM AMBCFG WHERE position('ControlDeStockEnBase' in ini) > 0) THEN
	    IF EXISTS (SELECT * FROM ARTC WHERE IDART = pIdArt AND tipoarta = 'CSK' AND codartr = 'CESK') THEN
			IF (SELECT stock FROM STK WHERE idart = pIdArt and CodStkDep = pCodStkDep) < 0 THEN 
			   vMensaje := ' El articulo ' 
			   		 || (SELECT COD || ' - ' || NOMBRE FROM ART WHERE id = pIdART)
			                || ' quedaria con stock negativo en el depósito ' 
					 || (SELECT nombre FROM stkdep WHERE COD = pCodStkDep);
			   RAISE EXCEPTION '%',vMensaje;
			END IF;
		END IF;
	END IF;
	RETURN;
END;
$BODY$;

ALTER FUNCTION stock.actualizar_stk(integer, character varying, numeric, numeric)
    OWNER TO abacouser;

COMMENT ON FUNCTION stock.actualizar_stk(integer, character varying, numeric, numeric)
    IS 'Función para modificar el stk de un artículo en un depósito dado.';


--
SELECT aaVersion('519.04','519.03');
--	
	
	


